﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Text;
using System.Drawing;
using System.Collections;

/**
* @author Quentin Leguay 4Info INSA Rennes 
* @date Avril 2010
* @brief La classe Vue est la classe qui contrôle l'affichage
*/
namespace vue{ 

    public class Vue
    {
        /***************/
        /** attributs **/
        /***************/

        // La fenetre qui affiche le programme
        private Form1 fenetre;

        private general.Logiciel logiciel;

        /***************/
        /**  méthodes **/
        /***************/
        public Vue(general.Logiciel _logiciel)
        {
            logiciel = _logiciel;
            fenetre = new Form1(this);
        }

        // RUN : lance le programme
        public void Run()
        {
            Application.Run(fenetre);
        }


        /***************/
        /**  méthodes **/
        /***************/

        /*
         * Met à jour le contenu de la fenêtre
        */
        public void refresh()
        {
            fenetre.Refresh();
        }


        /**
         * @brief
         * @brief rafraichit (supprime et réaffiche) les strokes de la couche supérieurer (calque courant) de l'InkPicture
         * @param Microsoft.Ink.Ink _ink : l'ink contenant les strokes du calque courant
         * @return void
        */
        public void completeRefresh(Microsoft.Ink.Ink _ink , ArrayList _annotations , ArrayList textes)
        {
            fenetre.completeRefresh(_ink,_annotations,textes);
        }


        /**
         * @brief rafraichit 
         * @brief permet de remonter le rafraichissement Form1->Vue->Logiciel pour ensuite redescendre avec les informations necessaires à la mise à jour
         * @param 
         * @return void
        */
        public void completeRefresh()
        {
            logiciel.completeRefresh();
        }

        /**
        * @brief undo
        * @brief remontée de l'évènement undo
        * @param int nb : le nombre d'annulations (actuellement 0)
        * @return int nb : le nombre d'annulations réalisées
        */
        public int undo(int _nb)
        {
            return logiciel.undo(_nb);
        }


        /**
        * @brief redo
        * @brief remontée de l'évènement redo
        * @param int nb : le nombre d'annulations (actuellement 0)
        * @return int nb : le nombre d'annulations refaites
        * @return void
        */
        public int redo(int _nb)
        {
            return logiciel.redo(_nb);
        }

        /**
        * @brief sendUtilisateur
        * @brief remontée de l'utilisateur
        * @param String _prenom : le prénom de l'utilisateur
        * @param String _nom : le nom de l'utilisateur
        * @return void
        */
        public void sendUtilisateur(string _prenom, string _nom)
        {
            //logiciel.sendUtilisateur(_prenom,_nom);
            fenetre.setUtilisateur(_prenom, _nom);
        }



        public vue.Form1 getFenetre()
        {
            return fenetre;

        }
        /**
         * @brief changerGraphics
         * @brief rafraichit la couche intermédiaire (calques non courants) de l'InkPicture
         * @param Microsoft.Ink.Ink _combinedInk : l'ink contenant les strokes des calques non courants
         * @return void
        */
        public void changerGraphics(Microsoft.Ink.Ink _combinedInk,ArrayList _annotations)
        {
            fenetre.changerGraphics(_combinedInk, _annotations);
        }

        /*************************
        * Traitement des actions *
        **************************/ 

        /**
         * @brief Appel aux actions des modes
         * @param Strokes _strokes : objet contenant de nombreuses informations (analogue à ensemble de points)
         * @return void
        */
        public void ActionZoneDessin(Microsoft.Ink.Stroke _stroke)
        {
            logiciel. ActionZoneDessin(_stroke);
        }

        // clic sur le bouton sur le côté du stylet
        public void ActionBouton()
        {
            logiciel.ActionBouton();
        }

        // tracer un trait sur la zone de dessin avec la "gomme"
        public void ActionEffacer(Microsoft.Ink.Strokes _strokes)
        {
            logiciel.ActionEffacer(_strokes);
        }


        public void ActionDoubleClic(Microsoft.Ink.Strokes _strokes)
        {
            logiciel.ActionDoubleClic(_strokes);
        }

        public void changerMode(Controleur.Mode _mode)
        {
            logiciel.changerMode(_mode);
        }

        // Change la couleur du mode
        public void changerCouleur(System.Drawing.Color _couleur)
        {
            logiciel.changerCouleur(_couleur);
        }

        public void changerCalqueCourant(int numero_calque)
        {
            logiciel.changerCalqueCourant(numero_calque);

        }


        public void creeCalque()
        {
            logiciel.creeCalque();
        }

        public void changeVisibility(int numero_calque)
        {
            logiciel.changeVisibility(numero_calque);
        }

        public void clear()
        {
            this.logiciel.clear();
        }

        public List<System.Drawing.Point> lancer_recherche(bool recherche_dans_balise,
                                                      bool recherche_dans_encre,
                                                      bool recherche_dans_texte,
                                                      string mot_cle)
        {
           return logiciel.lancer_recherche(recherche_dans_balise,
                                                      recherche_dans_encre,
                                                      recherche_dans_texte,
                                                      mot_cle);
        }

        public void sauver(String nomFichier)
        {
            logiciel.sauver(nomFichier);
        }

        public void ouvrir(String nomFichier)
        {
            logiciel.ouvrir(nomFichier);
        }

    }
}
